home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-04-27 | 6.5 KB | 321 lines | [TEXT/MPS ] |
- #ifndef __HANDLEMANAGER__
- #include "HandleManager.h"
- #endif
-
- #ifndef __MEMORY__
- #include <memory.h>
- #endif
-
- #ifndef __OSUTILS__
- #include <osutils.h>
- #endif
-
-
- // Default is only application heap is used
- Boolean HandleManager::fMaySpecifyTempMemory = false;
-
-
-
-
- /*µ class SystemHandleManager
- ** This class implements the HandleManager primitives for items allocated
- ** from the system heap. Most of the methods are identical with the those
- ** in HandleManager.
- */
- class SystemHandleManager : public HandleManager {
- public:
- virtual void MoveHHi(void **aHandle, OSErr *anErr);
- virtual void **NewHandle(size_t aSize, OSErr *anErr);
- virtual void Duplicate(void **aSrcHandle, void ***aDstHandle, OSErr *anErr);
- virtual size_t FreeMem();
- virtual size_t MaxMem(size_t *grow);
- };
-
-
- //µ SystemHandleManager::MoveHHi
- #pragma segment HandleManager
- void SystemHandleManager::MoveHHi(void **, OSErr *anErr)
- {
- // Do nothing
- *anErr = noErr;
- }
-
-
- //µ SystemHandleManager::NewHandle
- #pragma segment HandleManager
- void **SystemHandleManager::NewHandle(size_t aSize, OSErr *anErr)
- {
- void **aHandle = ::NewHandleSysClear((Size)aSize);
-
- *anErr = MemError();
- return (aHandle);
- }
-
-
- //µ SystemHandleManager::Duplicate
- #pragma segment HandleManager
- void SystemHandleManager::Duplicate(void **aSrcHandle, void ***aDstHandle, OSErr *anErr)
- {
- size_t aSize = GetHandleSize(aSrcHandle, anErr);
-
- if (anErr == noErr) {
- *aDstHandle = NewHandle(aSize, anErr);
- if (*anErr == noErr)
- BlockMove(*aSrcHandle, **aDstHandle, aSize);
- }
- }
-
-
- //µ SystemHandleManager::FreeMem
- #pragma segment HandleManager
- size_t SystemHandleManager::FreeMem()
- {
- THz aZone = GetZone();
-
- SetZone(SystemZone());
- size_t avail = (size_t)::FreeMem();
- SetZone(aZone);
-
- return (avail);
- }
-
-
- //µ SystemHandleManager::MaxMem
- #pragma segment HandleManager
- size_t SystemHandleManager::MaxMem(size_t *grow)
- {
- THz aZone = GetZone();
-
- SetZone(SystemZone());
- size_t aSize = (size_t)::MaxMem((Size *)grow);
- SetZone(aZone);
-
- return (aSize);
- }
-
-
-
- /*µ class TempHandleManager
- ** This class implements the HandleManager primitives for items allocated
- ** from the MultiFinder heap. It assumes the existence of System 7.0. Note
- ** that the class is derived from SystemHandleManager as this class's needs are similar
- ** to those of SystemHandleManager.
- */
- class TempHandleManager : public SystemHandleManager {
- public:
- virtual void Lock(void **aHandle, OSErr *anErr);
- virtual void Unlock(void **aHandle, OSErr *anErr);
- virtual void **NewHandle(size_t aSize, OSErr *anErr);
- virtual void DisposHandle(void **aHandle, OSErr *anErr);
- virtual size_t FreeMem();
- virtual size_t MaxMem(size_t *grow);
- };
-
-
- //µ TempHandleManager::NewHandle
- #pragma segment HandleManager
- void **TempHandleManager::NewHandle(size_t aSize, OSErr *anErr)
- {
- return (::TempNewHandle((Size)aSize, anErr));
- }
-
-
- //µ TempHandleManager::Lock
- #pragma segment HandleManager
- void TempHandleManager::Lock(void **aHandle, OSErr *anErr)
- {
- ::TempHLock((Handle)aHandle, anErr);
- }
-
-
- //µ TempHandleManager::Unlock
- #pragma segment HandleManager
- void TempHandleManager::Unlock(void **aHandle, OSErr *anErr)
- {
- ::TempHUnlock((Handle)aHandle, anErr);
- }
-
-
- //µ TempHandleManager::DisposHandle
- #pragma segment HandleManager
- void TempHandleManager::DisposHandle(void **aHandle, OSErr *anErr)
- {
- ::TempDisposeHandle((Handle)aHandle, anErr);
- }
-
-
- //µ TempHandleManager::FreeMem
- #pragma segment HandleManager
- size_t TempHandleManager::FreeMem()
- {
- return ((size_t)::TempFreeMem());
- }
-
-
- //µ TempHandleManager::MaxMem
- #pragma segment HandleManager
- size_t TempHandleManager::MaxMem(size_t *grow)
- {
- return ((size_t)::TempMaxMem((Size *)grow));
- }
-
-
-
- //µ –- HandleManager implementation -–
-
- //µ HandleManager::SetHandleSize
- #pragma segment HandleManager
- void HandleManager::SetHandleSize(void **aHandle, size_t newSize, OSErr *anErr)
- {
- ::SetHandleSize((Handle)aHandle, (Size)newSize);
- *anErr = MemError();
- }
-
-
- //µ HandleManager::GetHandleSize
- #pragma segment HandleManager
- size_t HandleManager::GetHandleSize(void **aHandle, OSErr *anErr)
- {
- Size aSize = ::GetHandleSize((Handle)aHandle);
-
- *anErr = MemError();
- return ((size_t)aSize);
- }
-
-
- //µ HandleManager::HLock
- #pragma segment HandleManager
- void HandleManager::HLock(void **aHandle, OSErr *anErr)
- {
- ::HLock((Handle)aHandle);
- *anErr = MemError();
- }
-
-
- //µ HandleManager::HUnlock
- #pragma segment HandleManager
- void HandleManager::HUnlock(void **aHandle, OSErr *anErr)
- {
- ::HUnlock((Handle)aHandle);
- *anErr = MemError();
- }
-
-
- //µ HandleManager::MoveHHi
- #pragma segment HandleManager
- void HandleManager::MoveHHi(void **aHandle, OSErr *anErr)
- {
- ::MoveHHi((Handle)aHandle);
- *anErr = MemError();
- }
-
-
- //µ HandleManager::NewHandle
- #pragma segment HandleManager
- void **HandleManager::NewHandle(size_t aSize, OSErr *anErr)
- {
- THz aZone = GetZone();
-
- SetZone(ApplicZone());
- void **aHandle = ::NewHandleClear((Size)aSize);
- SetZone(aZone);
-
- *anErr = MemError();
- return (aHandle);
- }
-
-
- //µ HandleManager::Duplicate
- #pragma segment HandleManager
- void HandleManager::Duplicate(void **aSrcHandle, void ***aDstHandle, OSErr *anErr)
- {
- THz aZone = GetZone();
-
- SetZone(ApplicZone());
- *aDstHandle = aSrcHandle;
- *anErr = ::HandToHand((Handle *)aDstHandle);
- SetZone(aZone);
- }
-
-
- //µ HandleManager::DisposHandle
- #pragma segment HandleManager
- void HandleManager::DisposHandle(void **aHandle, OSErr *anErr)
- {
- ::DisposHandle((Handle)aHandle);
- *anErr = MemError();
- }
-
-
- //µ HandleManager::FreeMem
- #pragma segment HandleManager
- size_t HandleManager::FreeMem()
- {
- THz aZone = GetZone();
-
- SetZone(ApplicZone());
- size_t aSize = (size_t)::FreeMem();
- SetZone(aZone);
-
- return (aSize);
- }
-
-
- //µ HandleManager::MaxMem
- #pragma segment HandleManager
- size_t HandleManager::MaxMem(size_t *grow)
- {
- THz aZone = GetZone();
-
- SetZone(ApplicZone());
- size_t aSize = (size_t)::MaxMem((Size *)grow);
- SetZone(aZone);
-
- return (aSize);
- }
-
-
-
-
-
-
- static HandleManager gHandleProcApp;
- static SystemHandleManager gHandleProcSys;
- static TempHandleManager gHandleProcTemp;
-
-
-
- //µ HandleManager::GetManager
- //
- #pragma segment HandleManager
- HandleManager *HandleManager::GetManager(HandleManagerHeap whichHeap)
- {
- switch (whichHeap) {
- case kSysHandleManager:
- return (&gHandleProcSys);
- // break;
-
- case kTempHandleManager:
- return (&gHandleProcTemp);
- // break;
-
- case kAppHandleManager:
- default:
- return (&gHandleProcApp);
- // break;
- }
- }
-
-
- //µ HandleManager::HandleManager
- #pragma segment HandleManager
- HandleManager *HandleManager::GetLargestManager()
- {
- if (fMaySpecifyTempMemory && gHandleProcTemp.FreeMem() > gHandleProcApp.FreeMem())
- return (&gHandleProcTemp);
- else
- return (&gHandleProcApp);
- }
-
-
-